'''
数据库操作
1.使用SQLALchemy：定义模型，配置数据库，执行基本的CRUD操作
2.创建和和管理数据库：使用创建表，db.create_all()
3.CRUD操作：增删查改
4.查询操作：执行基本和复杂查询，包括排序和分页
5.Flask-Migrate：使用Flask-Migrate管理数据库迁移
6.执行原始SQL：使用原始SQL语句进行数据库操作
'''
import logging
from flask import Flask,render_template,request,redirect,url_for
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import select
logging.basicConfig(level=logging.ERROR,format='%(levelname)s: %(message)s') #log不显示traceback只显示levelname和message
app=Flask(__name__)
app.secret_key = 'your-secret-key-here'  # 添加secret_key，用于session和CSRF保护
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///example.db' #使用SQL数据库
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
db=SQLAlchemy(app)

#2.定义模型
#模型是数据库表的python类，每个模型类代表数据库的一张表
class User(db.Model):
    id =db.Column(db.Integer,primary_key=True)
    username=db.Column(db.String(80),unique=True,nullable=False)
    email=db.Column(db.String(120),unique=True,nullable=False)

    def __repr__(self):
        return f'<User {self.username}>'

#db.Model:所用模型类需要继承自db.Model。
#db.Column:定义模型的字段，指定字段的类型、是否为主键、是否唯一、是否可以为空属性。

#3.创建和管理数据库
#创建数据库和表
#定义模型后，可以使用SQLALchemy提供的方法来创建数据库和表
with app.app_context():
    db.create_all()
#创建所有在当前上下文中定义的模型对应的表
#4.基本的CRUD操作
@app.route('/add_user',methods=['POST'])
def add_user():
    name=request.form.get('name')
    email=request.form.get('email')
    new_user=User(username=name,email=email)
    
    try :
        db.session.add(new_user)
        db.session.commit()
    except Exception as e:
#        print(f'数据库提交失败{e}')
        logging.error(f'发生错误：{e}')
    return redirect('/crud')
#    return f'User added <name>:{name} <email>:{email}'
#db.session.add()：将新用户对象添加到会话中
#db.session.commit()：提交事务，将更改保存到数据库
@app.route('/get_users',methods=['POST'])
def get_users():
    users=User.query.all()
    return '<br>'.join([f'{user.username}({user.email})' for  user in users])

#User.query.all():查询所有用户记录

#删除记录
@app.route('/delete_user',methods=['POST'])
def delete_user():
    user_name=request.form.get('userid')
    user=User.query.filter_by(username=user_name,).first()
    if user != None:
        try :
            db.session.delete(user)
            db.session.commit()
            return redirect('/crud')
        except Exception as e:
            logging.error(f'发生错误：{e}')
            return redirect('/crud')
    else:
        print('查询出错')
    return redirect('/crud')

#查询操作
#基本查询 users=User.query.filiter_by(username='join_doe').all()
#filter_by:根据字段值过滤记录

@app.route('/update_user',methods=['POST'])
def update():
    user_name=request.form.get('name')
    user_email=request.form.get('email')
    user=User.query.filter_by(username=user_name).first()
    if user !=None:
        try :
            user.username=user_name
            user.email=user_email
            db.session.commit()
            return redirect('/crud')
        except Exception as e:
            print(f'出现错误{e}')
            return '出错咯'
    else :
        print('出错咯')
        return redirect('/crud')
    
#排序和分页
#users=User.query.order_by(User.username).paginate(page=1,per_page=10)
#order_by()：按指定字段排序
#paginate()：分页查询

#使用flask-Migrate
from flask_migrate import Migrate
migrate =Migrate(app,db)
#flask --app 9_1flask_sql.py:app db init
#flask --app 9_1flask_sql.py:app db migrate -m "Initial migration"
#flask -app 9_1flask_sql.py:app db upgrade
@app.route('/raw_sql')
def raw_sql():
    result=db.session.execute('SELECT * FROM user')
    return '<br>'.join([str(row) for row in result])
#db.session.execute():执行原始SQL查询库

from flask_wtf import FlaskForm
from wtforms import StringField,EmailField,SubmitField
from wtforms.validators import DataRequired ,Email

class Myform(FlaskForm):
    name=StringField('name',validators=[DataRequired()])
    email=EmailField('Email',validators=[DataRequired(),Email()])
    submit=SubmitField("Submit")
@app.route('/crud',methods=["POST","GET"])
def crud():
    return render_template('crud.html')


if __name__=='__main__':
    app.run(debug=True)